package aidn.animation.controller 
{
	import flash.display.DisplayObjectContainer;
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.utils.getTimer;
	
	/**
	 * 任意の MovieClip を用いて雪を降らせます。
	 */
	public class MovieClipSnow
	{	
		// [Methods]
		//
		// MovieClipSnow ( )
		// setClass ( classes :/*Class*/Array )
		// addClass ( classes :/*Class*/Array )
		// 
		// start ( num :int, scale :Number = 1.0, px :Number = 1, py :Number = 1, rotX :Number = 0.0, rotY :Number = 0.0, rotZ :Number = 0.0, ts :int = 500 )
		// 
		// setStageSize ( w :int, h :int )
		// setTarget ( target :DisplayObjectContainer )
		
		
		
		private var mcs       :/*MovieClip*/Array;
		private var ClassList :/*Class*/Array;
		
		private var _num   :int;
		private var _scale :Number;
		private var _px    :Number;
		private var _py    :Number;
		private var _rotX  :Number;
		private var _rotY  :Number;
		private var _rotZ  :Number;
		
		private var _stw :int = 640;
		private var _sth :int = 480;
		
		private var _target :DisplayObjectContainer;
		
		
		public function MovieClipSnow ( ) 
		{
			
		}
		
		/**
		 * クラス(MovieClip)配列をセットします。
		 * @param	classes
		 */
		public function setClass ( classes :/*Class*/Array ) :void
		{
			var len :uint = classes.length;
			
			ClassList = [];
			for ( var i :int = 0; i < len; i ++ )
				ClassList.push( classes[i] );
		}
		/**
		 * クラス(MovieClip)配列を追加します。
		 * @param	classes
		 */
		public function addClass ( classes :/*Class*/Array ) :void
		{
			var len :uint = classes.length;
			
			for ( var i :int = 0; i < len; i ++ )
				ClassList.push( classes[i] );
		}
		/**
		 * ステージサイズをセットします。
		 * @param	w	stageWidth
		 * @param	h	stageHeight
		 */
		public function setStageSize ( w :int, h :int ) :void
		{
			_stw = w;
			_sth = h;
		}
		/**
		 * addChild する対象をセットします。
		 * @param	target
		 */
		public function setTarget ( target :DisplayObjectContainer ) :void
		{
			_target = target;
		}
		
		/**
		 * アニメーション開始します。
		 * @param	num		個数
		 * @param	scale	スケール
		 * @param	px		x 軸に揺れる量
		 * @param	py		y 軸移動量
		 * 
		 * @param	rotX	x 回転
		 * @param	rotY	y 回転
		 * @param	rotZ	z 回転
		 * @param	ts		揺れ速度調整
		 */
		public function start ( num :int, scale :Number = 1.0, px :Number = 1, py :Number = 1, rotX :Number = 0.0, rotY :Number = 0.0, rotZ :Number = 0.0, ts :int = 500 ) :void
		{
			_num   = num;
			_scale = scale;
			_px    = px;
			_py    = py;
			_rotX  = rotX;
			_rotY  = rotY;
			_rotZ  = rotZ;
			
			mcs = [];
			
			for ( var i :int = 0; i < _num; i ++ )
			{
				var r :int = Math.floor(Math.random() * ClassList.length);
				var m :MovieClip = new ClassList[r]() as MovieClip;
				
				m.x = Math.random() * _stw;
				
				
				if ( _py < 0 )	m.y = _sth + Math.random() * _sth + 50;
				else			m.y =      - Math.random() * _sth - 50;
				
				m.px   = Math.random() * (_px   * 0.6) + _px   * 0.7;
				m.py   = Math.random() * (_py   * 0.6) + _py   * 0.7;
				
				m.rotX = Math.random() * (_rotX * 0.6) + _rotX * 0.7;
				m.rotY = Math.random() * (_rotY * 0.6) + _rotY * 0.7;
				m.rotZ = Math.random() * (_rotZ * 0.6) + _rotZ * 0.7;
				
				// 逆回転
				if ( Math.random() < 0.5 )	m.rotX = - m.rotX;
				if ( Math.random() < 0.5 )	m.rotY = - m.rotY;
				if ( Math.random() < 0.5 )	m.rotZ = - m.rotZ;
				
				m.t  = Math.random() * 2 - 1;
				m.ts = Math.random() * ts * 0.7 + ts;
				
				if ( Math.random() < 0.5 )	m.ts = - m.ts;
				
				m.scaleX = m.scaleY = Math.random() * (_scale * 0.6) + _scale * 0.7;
				
				if ( _target )	_target.addChild( m );
				
				mcs.push( m );
			}
			
			mcs[0].addEventListener( Event.ENTER_FRAME, _enterFrameHandler );
		}
		
		/* ENTER FRAME */
		private function _enterFrameHandler ( evt :Event ) :void
		{
			// trace( _num, mcs[0].py );
			
			for ( var i :int = 0; i < _num; i ++ )
			{
				var m :MovieClip = mcs[i];
				
				if ( m.px != 0 )
					m.x += Math.sin( getTimer() / m.ts + m.t ) * m.px;
				
				m.y += m.py;
				
				m.rotationX += m.rotX;
				m.rotationY += m.rotY;
				m.rotationZ += m.rotZ;
				
				if ( m.py < 0 )
				{
					if ( m.y  < - 50 )     m.y = _sth + Math.random() * _sth + 50;
				}
				else
				{
					if ( _sth + 50 < m.y ) m.y =      - Math.random() * _sth - 50;
				}
			}
		}
		
	}
}